package co.gov.medellin.ssti.sub.paoyer.administration.dao;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import java.util.ArrayList;
import java.sql.PreparedStatement;

import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.ProgramVO;

/**
 * DAO para crear, consultar y actualizar registros en la tabla TCS_PROGRAMA.
 * 
 * @author Rene.Rangel@consultsoft.com
 * @version 1.0
 */

public class ProgramDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public ProgramDAO(Connection conn) {
		this.conn = conn;
	}

	/**
	 * Consulta un grupo de registros de la tabla TCS_PROGRAMA a partir de las
	 * condiciones que vienen en el Value Object
	 * 
	 * @param ProgramVO
	 *            Value Object con las condiciones a tener encuenta.
	 * 
	 * @return Collection Arreglo de registros retornados de la consulta.
	 */
	public Collection<ProgramVO> findProgramByCriterea(ProgramVO criterea)
			throws SQLException {

		/**
		 * Aqui la busqueda se hace en la tabla Tcs_Programa
		 */

		String query = "SELECT prog.codigo, prog.nombre, prog.descripcion, "
				+ "prog.usuario_crea, prog.terminal_crea, "
				+ "prog.usuario_modifica, prog.terminal_modifica, "
				+ "TO_CHAR(prog.desde_vigencia,'yyyy-mm-dd' ) desde_vigencia, "
				+ "TO_CHAR(prog.hasta_vigencia,'yyyy-mm-dd' ) hasta_vigencia, "
				+ "prog.vigencia, prog.tipo_progr, prog.ubicacion, "
				+ "prog.version, prog.estandar_cs " + "FROM tcs_programa prog "
				+ "WHERE ROWNUM <= 51 ";

		String filters = "";
		// Filtro por Nombre
		if ((criterea.getName() != null) && !(criterea.getName().equals(""))) {
			filters = filters + " AND UPPER(prog.nombre) LIKE '%"
					+ criterea.getName().toUpperCase() + "%' ";
		}

		// Filtro por Descripcion
		if ((criterea.getDescription() != null)
				&& !(criterea.getDescription().equals(""))) {
			filters = filters + " AND UPPER(prog.descripcion) LIKE '%"
					+ criterea.getDescription().toUpperCase() + "%' ";
		}

		// Filtro por Tipo de Programa
		if ((criterea.getProgramType() != null)
				&& !(criterea.getProgramType().equals(""))) {
			filters = filters + " AND prog.tipo_progr ='"
					+ criterea.getProgramType().toUpperCase() + "'";
		}

		// Filtro por Ubicacion
		if ((criterea.getTarget() != null)
				&& !(criterea.getTarget().equals(""))) {
			filters = filters + " AND prog.ubicacion = '"
					+ criterea.getTarget().toUpperCase() + "'";
		}

		// Filtro por Version
		if ((criterea.getVersion() != null)
				&& !(criterea.getVersion().intValue() == 0)) {
			filters = filters + " AND prog.version =" + criterea.getVersion();
		}

		// Filtro por Indicador EstandarCS
		if ((criterea.getCsEstandar() != null)
				&& !(criterea.getCsEstandar().equals(""))) {
			filters = filters + " AND prog.estandar_cs = '"
					+ criterea.getCsEstandar().toUpperCase() + "'";
		}

		// Filtro por Desde Vigencia
		if (criterea.getEffectiveFrom() != null
				&& !(criterea.getEffectiveFrom().equals(""))) {
			filters = filters + " AND prog.desde_vigencia = to_date('"
					+ criterea.getEffectiveFrom() + "','yyyy-mm-dd')";
		}

		// Filtro por Hasta Vigencia
		if (criterea.getEffectiveUntil() != null
				&& !(criterea.getEffectiveUntil().equals(""))) {
			filters = filters + " AND prog.hasta_vigencia = to_date('"
					+ criterea.getEffectiveUntil() + "','yyyy-mm-dd')";
		}

		// Filtro por Vigencia
		if (criterea.getUse() != null && !(criterea.getUse().equals(""))) {
			filters = filters + " AND prog.vigencia = '"
					+ criterea.getUse().toUpperCase() + "'";
		}

		// Filtro por Codigo
		if (criterea.getCode() != null && !(criterea.getCode().intValue() == 0)) {
			filters = filters + " AND prog.codigo = " + criterea.getCode();
		}

		// Si hay filtros, entonces armar la clausula WHERE
		if (!filters.equalsIgnoreCase("")) {
			query = query + filters;
		}
		Statement stm = null;
		ResultSet rst = null;
		ArrayList<ProgramVO> programs = new ArrayList<ProgramVO>();

		stm = conn.createStatement();
		rst = stm.executeQuery(query);

		while (rst.next()) {
			ProgramVO program = new ProgramVO();
			program.setCode(new Long(rst.getLong("codigo")));
			program.setName(rst.getString("nombre"));
			program.setDescription(rst.getString("descripcion"));
			program.setWebUserCrea(rst.getString("usuario_crea"));
			program.setWebClientCrea(rst.getString("terminal_crea"));
			program.setWebUserModif(rst.getString("usuario_modifica"));
			program.setWebClientModif(rst.getString("terminal_modifica"));
			program.setEffectiveFrom(rst.getString("desde_vigencia"));
			program.setEffectiveUntil(rst.getString("hasta_vigencia"));
			program.setUse(rst.getString("vigencia"));
			program.setProgramType(rst.getString("tipo_progr"));
			program.setTarget(rst.getString("ubicacion"));
			program.setVersion(new Short(rst.getShort("version")));
			program.setCsEstandar(rst.getString("estandar_cs"));

			programs.add(program);
		}

		stm.close();

		return programs;
	}

	/**
	 * Crea un nuevo registro en la tabla TCS_PROGRAMA.
	 * 
	 * @param ProgramVO
	 *            Value Object con el registro que se va a Crear.
	 * 
	 * @return ProgramVO Registro creado.
	 * 
	 */
	public ProgramVO createProgram(ProgramVO newProgram) throws SQLException {

		String strSQL = "";
		boolean result = false;
		PreparedStatement ps = null;
		strSQL = ""
				+ "INSERT INTO tcs_programa (codigo, nombre, descripcion, usuario_crea, "
				+ "  terminal_crea, usuario_modifica, terminal_modifica, "
				+ "  tipo_progr, ubicacion) "
				+ "VALUES(scs_programa.nextval,?,?,?,?,?,?, " + "?,?)";

		ps = conn.prepareStatement(strSQL);
		ps.setString(1, newProgram.getName().toUpperCase());
		ps.setString(2, newProgram.getDescription().toUpperCase());
		ps.setString(3, newProgram.getWebUserCrea());
		ps.setString(4, "WEB=" + newProgram.getWebClientCrea());
		ps.setString(5, newProgram.getWebUserModif());
		ps.setString(6, "WEB=" + newProgram.getWebClientModif());
		// ps.setString(7, newProgram.getEffectiveFrom());
		// ps.setString(8, newProgram.getEffectiveUntil());
		// ps.setString(9, newProgram.getUse().toUpperCase());
		ps.setString(7, newProgram.getProgramType().toUpperCase());
		ps.setString(8, newProgram.getTarget().toUpperCase());
		// ps.setShort(12, newProgram.getVersion().shortValue());
		// ps.setString(13, newProgram.getCsEstandar());

		result = ps.execute();

		if (!result) {
			Statement stm = conn.createStatement();
			ResultSet rst = stm
					.executeQuery("SELECT scs_programa.currval FROM dual");
			if (rst.next()) {
				newProgram.setCode(new Long(rst.getLong(1)));
			}
			stm.close();
			rst.close();
		}

		ps.close();

		return newProgram;
	}

	/**
	 * Actualiza un registro en la tabla TCS_PROGRAMA por la llave primaria.
	 * 
	 * @param ProgramVO
	 *            Value Object con el registro que se va a modificar.
	 * 
	 * @return ProgramVO Registro modificado.
	 * 
	 */
	public ProgramVO updateProgram(ProgramVO program) throws SQLException {

		String strSQL = "UPDATE tcs_programa " + "SET nombre = ?, "
				+ "descripcion = ?, " + "usuario_modifica = ?, "
				+ "terminal_modifica = ?, " +
				// "desde_vigencia = TO_DATE(?,'yyyy-mm-dd'), " +
				// "hasta_vigencia = TO_DATE(?,'yyyy-mm-dd'), " +
				// "vigencia = ?, " +
				"tipo_progr = ?, " + "ubicacion = ? " +
				// "version = ?, " +
				// "estandar_cs = ? " +
				"where codigo = ?";

		PreparedStatement ps = conn.prepareStatement(strSQL);
		ps.setString(1, program.getName().toUpperCase());
		ps.setString(2, program.getDescription().toUpperCase());
		ps.setString(3, program.getWebUserModif());
		ps.setString(4, "WEB=" + program.getWebClientModif());
		// ps.setString(5, program.getEffectiveFrom());
		// ps.setString(6, program.getEffectiveUntil());
		// ps.setString(7, program.getUse().toUpperCase());
		ps.setString(5, program.getProgramType().toUpperCase());
		ps.setString(6, program.getTarget());
		// ps.setShort(10, program.getVersion().shortValue());
		// ps.setString(11, program.getCsEstandar());
		ps.setLong(7, program.getCode().longValue());

		int updates = ps.executeUpdate();

		if (updates == 0) {
			return null;
		}

		ps.close();

		return program;

	}

	/**
	 * Borra un registro de la tabla TCS_PROGRAMA por la llave primaria.
	 * 
	 * @param ProgramVO
	 *            Value Object con el registro que se va a borrar.
	 * 
	 * @return boolean Indicador de exito de la operacion de borrado
	 */
	public boolean deleteProgram(ProgramVO program) throws SQLException {

		String strSQL = "DELETE tcs_programa " + "WHERE codigo = ?";
		PreparedStatement ps = conn.prepareStatement(strSQL);
		ps.setLong(1, program.getCode().longValue());
		boolean deletes = ps.execute();
		ps.close();
		return deletes;
	}

}